"""
有状态服务示例
功能：演示如何创建有状态的服务类，适用于需要预加载模型的推理服务
特点：使用 @modal.enter() 在容器启动时初始化，@modal.method() 暴露方法
运行：modal run 13_stateful_service.py
"""
import modal
import time

app = modal.App("stateful-model-app")
image = modal.Image.debian_slim().pip_install("scikit-learn")

@app.cls(image=image, gpu="A10G")
class MyModel:
    @modal.enter()  # 容器首次启动时执行一次
    def load_model(self):
        print("正在加载昂贵的模型...")
        time.sleep(5)  # 模拟模型加载
        self.model = "My Big Heavy Model"
        print("模型加载完成。")

    @modal.method()  # 暴露为可远程调用的方法
    def predict(self, input_data):
        print(f"使用已加载的 '{self.model}' 进行推理...")
        return f"Prediction for {input_data}"

@app.local_entrypoint()
def run():
    # 创建类的远程实例
    model_instance = MyModel()
    
    # 多次调用 predict，模型只加载一次
    print(model_instance.predict.remote("input 1"))
    print(model_instance.predict.remote("input 2"))